package com.tlias.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.sql.Date;
import java.util.Map;

public class JwtUtils {
    // 定义JWT的签名密钥，用于签名和验证token的完整性，此处使用的是字符串"Firefly"
    private static final String JWT_key = "Firefly";

    // 定义token的有效期，单位是毫秒。12*3600*1000L表示token有效期为12小时
    private static final long expire = 12 * 3600 * 1000L;

    /**
     * 生成JWT token
     * @param claims 包含需要嵌入到token中的声明信息（如用户ID、用户名等）
     * @return 返回一个字符串形式的JWT token
     */
//    Map<String, Object> claims = new HashMap<>();vvv
//        claims.put("id",1);
//        claims.put("username","admin");前端会传类似这样的数据进行加密，后端会进行解密
    public static String generateJwt(Map<String, Object> claims) {
        // 使用Jwts.builder()构建JWT token
        String jwt = Jwts.builder()
                // 添加自定义声明（payload），可以包含用户信息或其他业务数据
                .addClaims(claims)//vvv
                // 指定签名算法为HS256，并设置签名密钥为JWT_key
                .signWith(SignatureAlgorithm.HS256, JWT_key)
                // 设置token的过期时间，当前时间加上expire定义的时间长度
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                // 最后调用compact()方法将JWT对象序列化为字符串形式的token
                .compact();
        return jwt;
    }

    /**
     * 解析JWT token并获取其中的声明信息
     *
     * @param jwt 需要解析的JWT token字符串
     * @return 返回一个包含声明信息的Map对象
     */
    public static Claims parseJwt(String jwt) {
        // 使用Jwts.parser()创建JWT解析器
        Claims claims = Jwts.parser()
                // 设置签名密钥，用于验证token的签名是否有效
                .setSigningKey(JWT_key)
                // 解析给定的JWT token字符串，并提取出其中的声明部分
                .parseClaimsJws(jwt)
                // 获取JWT的payload部分，即声明信息
                .getBody();
        return claims;
    }
}
